0001 0000 ;------------------------------------------------------ 0002 0000 ; 0003 0000 ; Monitor multi-firmware per start-up 0004 0000 ; computer Z80 Nuova Elettronica 0005 0000 ; 0006 0000 ; Copyright Roberto Bazzano 2006 - 2024 0007 0000 ; 0008 0000 ;------------------------------------------------------ 0009 0000 ; 0010 0000 ; BANCHI 2 e 3 - Allocati da F800h a FFFFh 0011 0000 ; 0012 0000 ; NOTA: durante tutto il codice il registro B' contiene 00h se c'è la scheda video vecchia. Se non c'è contiene FFh 0013 0000 ; Il registro C' contiene il numero della pagina di menù visualizzata a video 0014 0000 ; Il registro D' se <> 00h indica che la routine "input" deve controllare anche il backspace (utilizzato dal programma di test della ram) 0015 0000 ; NOTA: I registri alternativi non vengono utilizzati dai monitor esadecimali 0016 0000 ; 0017 0000 ;------------------------------------------------------ 0018 0000 ; .org 00000h ; solo per debug con simulatore 0019 0000 ;------------------------------------------------------ 0020 0000 0021 0000 banco .equ 05fh ; porta di I/O per la selezione del banco di memoria della EPROM 0022 0000 0023 0000 menu1 .equ 0f000h ; routines ed indirizzi presenti in monitor1.asm 0024 0000 menu2 .equ 0f200h 0025 0000 menu3 .equ 0f400h 0026 0000 curs .equ 0f5f0h 0027 0000 out0 .equ 0f600h 0028 0000 out1 .equ out0+8 0029 0000 out2 .equ out1+8 0030 0000 out3 .equ out2+8 0031 0000 out4 .equ out3+8 0032 0000 out5 .equ out4+8 0033 0000 out6 .equ out5+8 0034 0000 out7 .equ out6+8 0035 0000 out8 .equ out7+8 0036 0000 out9 .equ out8+8 0037 0000 out10 .equ out9+8 0038 0000 out11 .equ out10+8 0039 0000 0040 0000 0041 F800 .org 0f800h 0042 F800 0043 F800 ; JUMP table 0044 F800 C3 3F F8 jp start ; F800h inizio firmware 0045 F803 C3 62 FB jp input ; F803h routine input da tastiere per monitor esadecimale 0046 F806 C3 32 FC jp video ; F806h routine output video per monitor esadecimale (visualizza su monitor vecchio, nuovo, e display tastiera esadecimale) 0047 F809 C3 1D FD jp lf0a5 ; F809h routine f0a5h identica a quella della eprom 2390 (inizializza i registri del SY6545 ed i PIO) 0048 F80C C3 F8 FC jp lf060 ; F80Ch routine f060h identica a quella della eprom 2390 (carica in R14, R15, R18 e R19 l'indirizzo (HL) del cursore e del carattere da visualizzare) 0049 F80F C3 08 FD jp lf06e ; F80Fh routine f06eh identica a quella della eprom 2390 (carica in R18 e R19 l'indirizzo (HL) del carattere da visualizzare) 0050 F812 C3 45 FA jp checv ; F812h routine calcolo presenza scheda video vecchia 0051 F815 C3 63 FA jp chect ; F815h routine controllo presenza scheda video vecchia 0052 F818 C3 83 FA jp waitv ; F818h routine di attesa ritraccia video vecchio 0053 F81B C3 16 FB jp waitn ; F81Bh routine di attesa ritraccia video nuovo 0054 F81E C3 03 FB jp writen ; F81Eh routine di scrittura carattere sul video nuovo 0055 F821 C3 AC FA jp cursor ; F821h routine di accensione/spegnimento cursore sul video nuovo 0056 F824 C3 1F FB jp vloc ; F824h calcola la locazione del video vecchio in base alla riga/colonna nella locazione puntata da HL e HL+1 per il video vecchio 0057 F827 C3 30 FB jp nloc ; F827h calcola la locazione del video nuovo in base alla riga/colonna nella locazione puntata da HL e HL+1 per il video nuovo 0058 F82A C3 25 FB jp vloc1 ; F82Ah calcola la locazione del video vecchio in base alla riga/colonna contenute in BC 0059 F82D C3 36 FB jp nloc1 ; F82Dh calcola la locazione del video nuovo in base alla riga/colonna contenute in BC 0060 F830 C3 6C FA jp initv ; F830h pulizia video vecchio 0061 F833 C3 91 FA jp initn ; F833h pulizia video nuovo 0062 F836 C3 6D FD jp ctabdi ; F836h calcola l'indirizzo della tabella TABDIS, per la conversione dei valori da visualizzare sui display, e lo ritorna in HL 0063 F839 C3 D4 FC jp vdisp ; F839h visualizza un messaggio puntato da HL sui display 0064 F83C C3 E7 FC jp vdispc ; F83Ch visualizza il carattere contenuto in A sul display puntato da C, convertendolo nel formato compatibile con i caratteri dei display 0065 F83F 0066 F83F 0067 F83F F3 start: di ; disabilita gli interrupt 0068 F840 21 ED 45 ld hl,045edh ; inizializza il vettore per l'NMI 0069 F843 22 66 00 ld (0066h),hl ; mettendo l'istruzione RETN (ED 45) 0070 F846 0071 F846 AF xor a ; spegne il motore del floppy 0072 F847 D3 D6 out (0d6h),a 0073 F849 0074 F849 D9 exx ; inizializza il registro D' in modo che l'input da tastiera NON controlli anche il backspace 0075 F84A 57 ld d,a 0076 F84B D9 exx 0077 F84C 0078 F84C 3E 28 ld a,28h ; seleziona il banco con le subroutines. IMPORTANTE: questo banco deve rimanere sempre selezionato durante l'esecuzione del monitor multifirmware 0079 F84E D3 5F out (banco),a 0080 F850 0081 F850 ;------------------------------------------------------ 0082 F850 ; Lancia test ram se al boot è stato premuto ESC (sulle tastiere alfanumeriche) o CTRL+F (sulla tastiera esadecimale) 0083 F850 ;------------------------------------------------------ 0084 F850 0085 F850 3E CF ld a,0cfh ; inizializza il PIO 1/B (tastiera) 0086 F852 D3 87 out (87h),a 0087 F854 AF xor a 0088 F855 3D dec a 0089 F856 D3 87 out (87h),a 0090 F858 0091 F858 tram1: ; controlla se esiste la scheda video vecchia 0092 F858 21 00 00 ld hl,00000h ; inizializza il contatore 0093 F85B 0094 F85B 23 tram2: inc hl ; attende al massimo fino a che HL non diventa 1000h 0095 F85C 7C ld a,h ; infatti la ritraccia a "1" come tempo resta al massimo con HL a 0111h 0096 F85D FE 10 cp 10h ; se impiega più tempo significa che la scheda LX.388 non è presente 0097 F85F 28 14 jr z,tram3 ; ha superato il timeout, quindi la scheda video vecchia non c'è 0098 F861 0099 F861 DB EB in a,(0ebh) ; controlla se c'è la ritraccia video 0100 F863 CB 7F bit 7,a 0101 F865 20 F4 jr nz,tram2 ; ritraccia non trovata, looppa 0102 F867 0103 F867 21 00 30 ld hl,03000h ; fa un ritardo per permettere alle tastiere di assestarsi all'accensione o al reset 0104 F86A 2B tram2a: dec hl 0105 F86B 7C ld a,h 0106 F86C B5 or l 0107 F86D 20 FB jr nz,tram2a 0108 F86F 0109 F86F DB EA in a,(0eah) ; controlla se c'è un tasto premuto sulla tastiera vecchia 0110 F871 CB 7F bit 7,a 0111 F873 20 17 jr nz,tram5 ; tasto premuto sulla tastiera vecchia 0112 F875 0113 F875 DB 85 tram3: in a,(085h) ; controlla se c'è un tasto premuto sulla tastiera nuova 0114 F877 2F cpl 0115 F878 CB 7F bit 7,a 0116 F87A 20 10 jr nz,tram5 ; tasto premuto sulla tastiera nuova 0117 F87C 0118 F87C 01 FF 01 ld bc,01ffh ; controlla se c'è un tasto premuto sulla tastiera esadecimale 0119 F87F DB F0 tram4: in a,(0f0h) ; fa 255 input. Quello che è il bin 7 a 0 è il tasto premuto (a causa del contatore hardware che fa lo scan dei tasti) 0120 F881 CB 7F bit 7,a 0121 F883 28 24 jr z,tram8 ; tasto premuto sulla tastiera esadecimale 0122 F885 0B dec bc 0123 F886 78 ld a,b 0124 F887 B1 or c 0125 F888 20 F5 jr nz,tram4 0126 F88A 0127 F88A 18 21 jr sp0 ; nessun tasto premuto 0128 F88C 0129 F88C E6 7F tram5: and 7fh ; controlla se è stato premuto ESC su una tastiera alfanumerica 0130 F88E FE 1B cp 01bh 0131 F890 20 1B jr nz,sp0 0132 F892 0133 F892 21 58 F6 tram6: ld hl,out11 ; visualizza "test ram" sui display 0134 F895 01 F7 08 ld bc,08F7h 0135 F898 7E tram7: ld a,(hl) 0136 F899 ED 79 out (c),a 0137 F89B 23 inc hl 0138 F89C 0D dec c 0139 F89D 05 dec b 0140 F89E AF xor a 0141 F89F B8 cp b 0142 F8A0 20 F6 jr nz,tram7 0143 F8A2 0144 F8A2 3E 26 ld a,26h ; seleziona il banco del programma per il test della ram 0145 F8A4 D3 5F out (banco),a 0146 F8A6 C3 00 F0 jp 0f000h ; salta al programma per il test della ram 0147 F8A9 0148 F8A9 FE 1F tram8: cp 01fh ; controlla se è stato premuto CTRL+F sulla tastiera esadecimale 0149 F8AB 28 E5 jr z,tram6 0150 F8AD 0151 F8AD ;------------------------------------------------------ 0152 F8AD 0153 F8AD 21 FF EB sp0: ld hl,0ebffh ; cerca dove posizionare lo SP prima di EC00 0154 F8B0 7E sp1: ld a,(hl) 0155 F8B1 2F cpl 0156 F8B2 77 ld (hl),a 0157 F8B3 BE cp (hl) 0158 F8B4 28 03 jr z,sp3 0159 F8B6 2B sp2: dec hl 0160 F8B7 18 F7 jr sp1 0161 F8B9 2F sp3: cpl 0162 F8BA 77 ld (hl),a 0163 F8BB BE cp (hl) 0164 F8BC 20 F8 jr nz,sp2 0165 F8BE F9 ld sp,hl 0166 F8BF 0167 F8BF CD 1D FD call lf0a5 ; inizializza i registri del SY6545 ed i PIO 0168 F8C2 0169 F8C2 CD 45 FA call checv ; imposta il registro B' che indica se esiste la scheda video vecchia 0170 F8C5 0171 F8C5 21 00 F6 tast0: ld hl,out0 ; visualizza il messaggio "SELECT" sui display 0172 F8C8 CD 50 FB call msg 0173 F8CB 0174 F8CB CD B5 FA call vmenu1 ; pulisce i video e visualizza il menù 0175 F8CE 0176 F8CE CD 62 FB tast0a: call input ; input da tastiere 0177 F8D1 F5 push af ; salva il numero digitato 0178 F8D2 0179 F8D2 FE 10 cp 10h 0180 F8D4 28 2E jr z,tast0c ; se è stato premuto CR salta subito al controllo del tasto 0181 F8D6 0182 F8D6 FE 13 cp 13h ; se è maggiore di SHIFT+2 looppa 0183 F8D8 30 F4 jr nc,tast0a 0184 F8DA FE 01 cp 01h ; se è minore di 1 looppa 0185 F8DC 38 F0 jr c,tast0a 0186 F8DE 0187 F8DE 21 F0 F5 ld hl,curs ; calcola la posizione sul video vecchio per visualizzare il numero digitato 0188 F8E1 CD 1F FB call vloc ; calcola in DE l'indirizzo del video in base alla riga/colonna nella locazione puntata da HL e HL+1 0189 F8E4 0190 F8E4 FE 11 cp 11h ; confronta il numero digitato con 11h 0191 F8E6 CD 04 FA call convnu ; converte il numero nei caratteri che rappresentano la voce di menù (AF non viene toccato) 0192 F8E9 30 07 jr nc,tast0b ; se il numero digitato è >=11h e quindi deve visualizzare due caratteri va a tast0b 0193 F8EB 0194 F8EB 7D ld a,l ; recupera il carattere da visualizzare 0195 F8EC 12 ld (de),a ; visualizza il carattere sul video vecchio 0196 F8ED CD 03 FB call writen ; e sul video nuovo - Il cursore è già posizionato 0197 F8F0 18 12 jr tast0c 0198 F8F2 0199 F8F2 7C tast0b: ld a,h ; recupera il primo carattere da visualizzare 0200 F8F3 12 ld (de),a ; visualizza il primo carattere sul video vecchio 0201 F8F4 CD 03 FB call writen ; e sul video nuovo - Il cursore è già posizionato 0202 F8F7 13 inc de ; punta alla posizione del successivo carattere a video 0203 F8F8 7D ld a,l ; recupera il secondo carattere da visualizzare 0204 F8F9 12 ld (de),a ; visualizza il secondo carattere sul video vecchio 0205 F8FA CD 03 FB call writen ; e sul video nuovo - Il cursore è già posizionato 0206 F8FD 0207 F8FD 13 inc de ; punta alla posizione del successivo carattere a video 0208 F8FE 3E 3C ld a,'<' ; visualizza il carattere "<" 0209 F900 12 ld (de),a ; sul video vecchio 0210 F901 CD 03 FB call writen ; e sul video nuovo - Il cursore è già posizionato 0211 F904 0212 F904 F1 tast0c: pop af ; ripristina il numero digitato 0213 F905 0214 F905 21 71 FD ld hl,tabtas ; calcola il puntatore all'indirizzo della routine presente nella tabella TABTAS e ci salta 0215 F908 C3 1A FA jp punt 0216 F90B 0217 F90B tast1: ; se 1 lancia il boot del basic da 5.5 K 0218 F90B 21 40 F6 ld hl,out8 ; messaggio da visualizzare sul display 0219 F90E CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0220 F911 3E 19 ld a,19h ; seleziona il banco del basic da 5.5 K su floppy 0221 F913 D3 5F out (banco),a 0222 F915 C3 00 F0 jp 0f000h 0223 F918 0224 F918 tast2: ; se 2 lancia il boot vecchio 0225 F918 21 08 F6 ld hl,out1 ; messaggio da visualizzare sul display 0226 F91B CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0227 F91E 3E 00 ld a,00h ; seleziona il banco della 1390 0228 F920 D3 5F out (banco),a 0229 F922 C3 00 F0 jp 0f000h 0230 F925 0231 F925 tast3: ; se 3 lancia il boot grafic 0232 F925 21 10 F6 ld hl,out2 ; messaggio da visualizzare sul display 0233 F928 CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0234 F92B 3E 01 ld a,01h ; seleziona il banco della 2390 0235 F92D D3 5F out (banco),a 0236 F92F C3 00 F0 jp 0f000h 0237 F932 0238 F932 tast4: ; se 4 lancia il boot del S.O.N.E. 0239 F932 21 48 F6 ld hl,out9 ; messaggio da visualizzare sul display 0240 F935 CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0241 F938 3E 1A ld a,1Ah ; seleziona il banco del s.o.n.e. 0242 F93A D3 5F out (banco),a 0243 F93C C3 00 F0 jp 0f000h 0244 F93F 0245 F93F tast5: ; se 5 lancia il basic in rom rilocato in ram 0246 F93F 21 18 F6 ld hl,out3 ; messaggio da visualizzare sul display 0247 F942 CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0248 F945 3E 08 ld a,08h ; seleziona il primo banco del basic in rom 0249 F947 11 00 00 ld de,00000h 0250 F94A 0251 F94A CD 3A FA tast5a: call setban ; sposta gli 8 banchi da 2K in ram 0252 F94D 3C inc a 0253 F94E 3C inc a 0254 F94F FE 18 cp 18h 0255 F951 20 F7 jr nz,tast5a 0256 F953 C3 00 00 jp 0000h ; salta al basic 0257 F956 0258 F956 tast6: ; se 6 lancia il monitor esadecimale originale non rilocato 0259 F956 CD 2E FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0260 F959 3E 04 ld a,04h ; seleziona il banco del monitor esadecimale originale 0261 F95B 11 00 80 ld de,08000h ; seleziona il banco indicato da A e lo sposta in ram 0262 F95E CD 3A FA call setban 0263 F961 C3 00 80 jp 8000h 0264 F964 0265 F964 tast7: ; se 7 lancia il monitor esadecimale non rilocato con lo SP rilocato prima di EC00 con il firmware non rilocato per il programmatore di eprom 0266 F964 CD 2E FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0267 F967 3E 20 ld a,20h ; seleziona il banco del monitor esadecimale con SP rilocato 0268 F969 11 00 80 ld de,08000h ; seleziona il banco indicato da A e lo sposta in ram 0269 F96C CD 3A FA call setban 0270 F96F C3 00 80 jp 8000h 0271 F972 0272 F972 tast8: ; se 8 lancia il monitor esadecimale rilocato con lo SP rilocato prima di EC00 per la tastiera alfanumerica con il firmware rilocato per il programmatore di eprom 0273 F972 CD 2E FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0274 F975 3E 1C ld a,1Ch ; seleziona il banco del monitor esadecimale rilocato per la tastiera alfanumerica 0275 F977 D3 5F out (banco),a 0276 F979 C3 00 F0 jp 0f000h 0277 F97C 0278 F97C tast9: ; se 9 lancia il monitor esadecimale rilocato con lo SP rilocato prima di EC00 per la tastiera esadecimale con il firmware rilocato per il programmatore di eprom 0279 F97C CD 2E FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0280 F97F 3E 1E ld a,1Eh ; seleziona il banco del monitor esadecimale rilocato per la tastiera esadecimale 0281 F981 D3 5F out (banco),a 0282 F983 C3 00 F0 jp 0f000h 0283 F986 0284 F986 tastA: ; se A lancia direttamente il bootstrap multiplo 0285 F986 21 28 F6 ld hl,out5 ; messaggio da visualizzare sul display 0286 F989 CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0287 F98C 3E 06 ld a,06h ; seleziona il banco della 2390 modificata per non fare il check sul disco di boot 0288 F98E D3 5F out (banco),a 0289 F990 C3 7D F1 jp 0f17dh ; salta direttamente al BOOT 0290 F993 0291 F993 tastB: ; se B lancia il loader del basic da 5.5 K 0292 F993 CD 2E FA call disp1 ; non visualizza alcun messaggio sui display e inizializza i video 0293 F996 3E 04 ld a,04h ; seleziona il banco del monitor esadecimale originale 0294 F998 11 00 80 ld de,08000h ; seleziona il banco indicato da A e lo sposta in ram 0295 F99B CD 3A FA call setban 0296 F99E 3E 18 ld a,18h ; seleziona il banco del loader del basic da 5.5 K su cassetta 0297 F9A0 11 00 00 ld de,00000h ; seleziona il banco indicato da A e lo sposta in ram 0298 F9A3 CD 3A FA call setban 0299 F9A6 C3 69 00 jp 0069h ; salta al loader 0300 F9A9 0301 F9A9 tastC: ; se C lancia la prova tastiera 0302 F9A9 21 30 F6 ld hl,out6 ; messaggio da visualizzare sul display 0303 F9AC CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0304 F9AF 3E 24 ld a,24h ; seleziona il banco del programma con la prova tastiera 0305 F9B1 D3 5F out (banco),a 0306 F9B3 C3 00 F0 jp 0f000h 0307 F9B6 0308 F9B6 tastD: ; se D salta a 0000h 0309 F9B6 21 38 F6 ld hl,out7 ; messaggio da visualizzare sul display 0310 F9B9 CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0311 F9BC C3 00 00 jp 0000h 0312 F9BF 0313 F9BF tastE: ; se E salta a 1000h 0314 F9BF 21 38 F6 ld hl,out7 ; messaggio da visualizzare sul display 0315 F9C2 CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0316 F9C5 C3 00 10 jp 01000h 0317 F9C8 0318 F9C8 tastF: ; se F sposta le routines di stampa per monitor esadecimale a 0070 0319 F9C8 3E 07 ld a,07h ; seleziona il banco delle routines di stampa 0320 F9CA 11 70 00 ld de,00070h ; seleziona il banco indicato da A e lo sposta in ram 0321 F9CD CD 3A FA call setban 0322 F9D0 3E 28 ld a,28h ; seleziona il banco delle subroutines 0323 F9D2 D3 5F out (banco),a 0324 F9D4 C3 C5 F8 jp tast0 0325 F9D7 0326 F9D7 tast10: ; se RETURN cambia pagina di menù 0327 F9D7 D9 exx ; carica il numero di pagina visualizzata in A 0328 F9D8 79 ld a,c 0329 F9D9 D9 exx 0330 F9DA 0331 F9DA 3C inc a ; punta alla pagina successiva 0332 F9DB FE 04 cp 04h ; se è minore di 4 va bene 0333 F9DD 38 02 jr c,tast1a 0334 F9DF 3E 01 ld a,01h ; altrimenti carica la prima pagina 0335 F9E1 0336 F9E1 21 95 FD tast1a: ld hl,tabmen ; calcola il puntatore all'indirizzo della routine presente nella tabella TABMEN e ci salta 0337 F9E4 CD 1A FA call punt ; effettua una CALL anziché un JP perché le routines vmenu1-2-3 escono con un RET 0338 F9E7 0339 F9E7 C3 CE F8 jp tast0a ; ritorna all'input da tastiera 0340 F9EA 0341 F9EA tast11: ; se SHIFT+1 lancia il programma per la conversione dei datamark dei floppy 0342 F9EA 21 50 F6 ld hl,out10 ; messaggio da visualizzare sul display 0343 F9ED CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0344 F9F0 3E 22 ld a,22h ; seleziona il banco del monitor esadecimale rilocato per la tastiera alfanumerica 0345 F9F2 D3 5F out (banco),a 0346 F9F4 C3 00 F0 jp 0f000h 0347 F9F7 0348 F9F7 tast12: ; se SHIFT+2 lancia il programma per il test della ram 0349 F9F7 21 58 F6 ld hl,out11 ; messaggio da visualizzare sul display 0350 F9FA CD 2B FA call disp ; visualizza il messaggio sui display e inizializza i video 0351 F9FD 3E 26 ld a,26h ; seleziona il banco del programma per il test della ram 0352 F9FF D3 5F out (banco),a 0353 FA01 C3 00 F0 jp 0f000h 0354 FA04 0355 FA04 ;------------------------------------------------------ 0356 FA04 ; converte il numero nella voce di menù 0357 FA04 ; ritorna HL contentente i due caratteri da visualizzare che sono blank+numero, oppure S+numero 0358 FA04 0359 FA04 26 20 convnu: ld h,020h ; 020h=blank 0360 FA06 0361 FA06 F5 push af ; visualizza il numero digitato 0362 FA07 FE 10 cp 010h ; se A < 010h 0363 FA09 38 04 jr c,convn1 0364 FA0B 0365 FA0B 26 53 ld h,053h ; 053h="S" - converte in "S"+numero 0366 FA0D D6 10 sub 010h 0367 FA0F 0368 FA0F FE 0A convn1: cp 0Ah 0369 FA11 38 02 jr c,convn2 ; se A < 0ah addiziona 30h, altrimenti addiziona 07h quindi addiziona 30h 0370 FA13 C6 07 add a,07h ; il risultato è che se A >= 0ah addiziona 037h, altrimenti 030h 0371 FA15 C6 30 convn2: add a,030h 0372 FA17 6F ld l,a 0373 FA18 0374 FA18 F1 pop af 0375 FA19 C9 ret 0376 FA1A 0377 FA1A ;------------------------------------------------------ 0378 FA1A ; calcola il puntatore ad una tabella di jump presente in HL e salta 0379 FA1A 0380 FA1A punt: 0381 FA1A F5 push af 0382 FA1B C5 push bc 0383 FA1C 0384 FA1C 3D dec a ; decrementa A, lo moltiplica per 2 e lo addiziona ad HL 0385 FA1D CB 27 sla a 0386 FA1F 4F ld c,a 0387 FA20 AF xor a 0388 FA21 47 ld b,a 0389 FA22 09 add hl,bc ; HL ora punta all'indirizzo da richiamare che è presente nella tabella 0390 FA23 4E ld c,(hl) ; carica il contenuto dell'indirizzo puntato da HL in BC 0391 FA24 23 inc hl 0392 FA25 46 ld b,(hl) 0393 FA26 C5 push bc ; sposta BC su HL 0394 FA27 E1 pop hl 0395 FA28 0396 FA28 C1 pop bc 0397 FA29 F1 pop af 0398 FA2A E9 jp (hl) ; salta alla routine calcolata 0399 FA2B 0400 FA2B ;------------------------------------------------------ 0401 FA2B ; visualizza il messaggio sui display, spegne il cursore sul video nuovo e inizializza i video 0402 FA2B ; Se HL=0 non visualizza il messaggio sui display 0403 FA2B ; Sporca AF 0404 FA2B 0405 FA2B CD 50 FB disp: call msg ; Visualizza il messaggio indicato da HL sui display 0406 FA2E 3E 20 disp1: ld a,20h ; Spegne il cursore sul video nuovo 0407 FA30 CD AC FA call cursor 0408 FA33 CD 6C FA call initv ; Inizializza il video vecchio 0409 FA36 CD 91 FA call initn ; Inizializza il video nuovo 0410 FA39 C9 ret 0411 FA3A 0412 FA3A ;------------------------------------------------------ 0413 FA3A ; Seleziona il banco indicato da A e lo sposta all'indirizzo indicato da DE 0414 FA3A ; Sporca tutti i registri 0415 FA3A 0416 FA3A D3 5F setban: out (banco),a ; seleziona il banco 0417 FA3C 21 00 F0 ld hl,0f000h ; sposta il banco in ram 0418 FA3F 01 00 08 ld bc,0800h 0419 FA42 ED B0 ldir 0420 FA44 C9 ret 0421 FA45 0422 FA45 ;------------------------------------------------------ 0423 FA45 ; controlla se la scheda video vecchia è presente. Per farlo verifica il cambiamento della ritraccia video 0424 FA45 ; se la scheda video vecchia esiste ritorna 00h in B' 0425 FA45 ; se la scheda video vecchia non esiste ritorna FFh in B' 0426 FA45 0427 FA45 F5 checv: push af 0428 FA46 E5 push hl 0429 FA47 0430 FA47 D9 exx ; mette 00h in B' 0431 FA48 06 00 ld b,00h 0432 FA4A D9 exx 0433 FA4B 0434 FA4B 21 00 00 ld hl,00000h ; inizializza il contatore 0435 FA4E 0436 FA4E 23 checv1: inc hl ; attende al massimo fino a che HL non diventa 1000h 0437 FA4F 7C ld a,h ; Infatti la ritraccia a "1" come tempo resta al massimo con HL a 0111h 0438 FA50 FE 10 cp 10h ; Se impiega più tempo significa che la scheda LX.388 non è presente 0439 FA52 20 06 jr nz,checv2 0440 FA54 0441 FA54 D9 exx ; se la LX.388 non è presente carica FF in B' ed esce 0442 FA55 06 FF ld b,0ffh 0443 FA57 D9 exx 0444 FA58 18 06 jr checv3 0445 FA5A 0446 FA5A DB EB checv2: in a,(0ebh) ; controlla se c'è la ritraccia video 0447 FA5C CB 7F bit 7,a 0448 FA5E 20 EE jr nz,checv1 ; ritraccia non trovata, looppa 0449 FA60 0450 FA60 E1 checv3: pop hl 0451 FA61 F1 pop af 0452 FA62 C9 ret 0453 FA63 0454 FA63 ;------------------------------------------------------ 0455 FA63 ; controlla se è stata rilevata la scheda video vecchia 0456 FA63 ; ritorna Z a 0 se non c'è, Z a 1 se c'è 0457 FA63 ; Sporca F 0458 FA63 0459 FA63 C5 chect: push bc ; salva il valore di A nel registro B 0460 FA64 47 ld b,a 0461 FA65 0462 FA65 D9 exx ; recupera il valore dal registro B' 0463 FA66 78 ld a,b 0464 FA67 D9 exx 0465 FA68 B7 or a ; imposta il flag Z 0466 FA69 0467 FA69 78 ld a,b ; recupera il valore di A dal registro B 0468 FA6A 0469 FA6A C1 pop bc 0470 FA6B C9 ret 0471 FA6C 0472 FA6C ;------------------------------------------------------ 0473 FA6C ; pulizia del video vecchio 0474 FA6C 0475 FA6C E5 initv: push hl 0476 FA6D D5 push de 0477 FA6E C5 push bc 0478 FA6F 21 00 EC ld hl,0ec00h 0479 FA72 11 01 EC ld de,0ec01h 0480 FA75 36 20 ld (hl),20h 0481 FA77 01 FF 01 ld bc,01ffh 0482 FA7A CD 83 FA call waitv ; attende la ritraccia 0483 FA7D ED B0 ldir 0484 FA7F C1 pop bc 0485 FA80 D1 pop de 0486 FA81 E1 pop hl 0487 FA82 C9 ret 0488 FA83 0489 FA83 ;------------------------------------------------------ 0490 FA83 ; attende la ritraccia del video vecchio 0491 FA83 0492 FA83 F5 waitv: push af 0493 FA84 0494 FA84 CD 63 FA call chect ; esce se non esiste la scheda video vecchia 0495 FA87 20 06 jr nz,waitv2 0496 FA89 0497 FA89 DB EB waitv1: in a,(0ebh) ; attende la ritraccia video 0498 FA8B CB 7F bit 7,a 0499 FA8D 20 FA jr nz,waitv1 0500 FA8F 0501 FA8F F1 waitv2: pop af 0502 FA90 C9 ret 0503 FA91 0504 FA91 ;------------------------------------------------------ 0505 FA91 ; pulizia del video nuovo 0506 FA91 0507 FA91 F5 initn: push af 0508 FA92 E5 push hl 0509 FA93 21 00 00 ld hl,0h 0510 FA96 CD 08 FD initn1: call lf06e ; carica in R18 e R19 l'indirizzo (HL) del carattere da visualizzare 0511 FA99 0512 FA99 3E 20 ld a,20h ; imposta il carattere a "blank" 0513 FA9B CD 03 FB call writen ; scrive il carattere 0514 FA9E 0515 FA9E 23 inc hl 0516 FA9F 7D ld a,l 0517 FAA0 FE 81 cp 81h 0518 FAA2 20 F2 jr nz,initn1 0519 FAA4 7C ld a,h 0520 FAA5 FE 07 cp 07h 0521 FAA7 20 ED jr nz,initn1 0522 FAA9 0523 FAA9 E1 pop hl 0524 FAAA F1 pop af 0525 FAAB C9 ret 0526 FAAC 0527 FAAC ;------------------------------------------------------ 0528 FAAC ; accende o spegne il cursore sul video nuovo 0529 FAAC ; A=00h accende, A=20h spegne 0530 FAAC 0531 FAAC F5 cursor: push af 0532 FAAD 0533 FAAD 3E 0A ld a,0ah ; seleziona il registro R10 0534 FAAF D3 8C out (8ch),a 0535 FAB1 0536 FAB1 F1 pop af ; scrive il valore 0537 FAB2 D3 8D out (8dh),a 0538 FAB4 0539 FAB4 C9 ret 0540 FAB5 0541 FAB5 ;------------------------------------------------------ 0542 FAB5 ; Subroutine per la visualizzazione del menù sui video 0543 FAB5 ; 0544 FAB5 0545 FAB5 21 00 F0 vmenu1: ld hl,menu1 ; visualizza la 1° pagina del menu 0546 FAB8 D9 exx ; carica in C' il numero della pagina visualizzata 0547 FAB9 0E 01 ld c,01h 0548 FABB D9 exx 0549 FABC 18 10 jr vis 0550 FABE 0551 FABE 21 00 F2 vmenu2: ld hl,menu2 ; visualizza la 2° pagina del menu 0552 FAC1 D9 exx ; carica in C' il numero della pagina visualizzata 0553 FAC2 0E 02 ld c,02h 0554 FAC4 D9 exx 0555 FAC5 18 07 jr vis 0556 FAC7 0557 FAC7 21 00 F4 vmenu3: ld hl,menu3 ; visualizza la 3° pagina del menu 0558 FACA D9 exx ; carica in C' il numero della pagina visualizzata 0559 FACB 0E 03 ld c,03h 0560 FACD D9 exx 0561 FACE 0562 FACE CD 2E FA vis: call disp1 ; pulisce i video 0563 FAD1 0564 FAD1 F5 push af 0565 FAD2 E5 vis1: push hl 0566 FAD3 CD 30 FB call nloc ; calcola in DE l'indirizzo del video nuovo in base alla riga/colonna nella locazione puntata da HL e HL+1 0567 FAD6 D5 push de 0568 FAD7 E1 pop hl 0569 FAD8 CD 08 FD call lf06e ; carica in R18 e R19 l'indirizzo (HL) del carattere da visualizzare 0570 FADB 0571 FADB E1 pop hl 0572 FADC CD 1F FB call vloc ; calcola in DE l'indirizzo del video vecchio in base alla riga/colonna nella locazione puntata da HL e HL+1 0573 FADF 0574 FADF 7E vis2: ld a,(hl) ; recupera il carattere da scrivere 0575 FAE0 CD 83 FA call waitv ; attende la ritraccia del video vecchio 0576 FAE3 12 ld (de),a ; visualizza il carattere sul video vecchio 0577 FAE4 13 inc de 0578 FAE5 0579 FAE5 CD 03 FB call writen ; attende la ritraccia e visualizza il carattere sul video nuovo 0580 FAE8 0581 FAE8 23 inc hl 0582 FAE9 AF xor a ; controlla se il prossimo carattere è 00h 0583 FAEA BE cp (hl) 0584 FAEB 20 F2 jr nz,vis2 0585 FAED 23 inc hl 0586 FAEE 2F cpl ; controlla se il prossimo carattere è 0ffh 0587 FAEF BE cp (hl) ; se no, ricarica la successiva prima posizione e looppa 0588 FAF0 20 E0 jr nz,vis1 0589 FAF2 0590 FAF2 21 F0 F5 ld hl,curs ; calcola in DE l'indirizzo del cursore in base alla riga/colonna nella locazione puntata da HL e HL+1 0591 FAF5 CD 30 FB call nloc 0592 FAF8 D5 push de 0593 FAF9 E1 pop hl 0594 FAFA CD F8 FC call lf060 ; carica in R14, R15, R18 e R19 l'indirizzo (HL) del cursore e del carattere da visualizzare 0595 FAFD 0596 FAFD AF xor a ; accende il cursore sul video nuovo 0597 FAFE CD AC FA call cursor 0598 FB01 0599 FB01 F1 pop af 0600 FB02 C9 ret 0601 FB03 0602 FB03 ;------------------------------------------------------ 0603 FB03 ; scrive il carattere presente in A sul video nuovo 0604 FB03 0605 FB03 CD 16 FB writen: call waitn ; attende la ritraccia 0606 FB06 D3 80 out (80h),a ; scrive il carattere 0607 FB08 F5 push af 0608 FB09 3E 1F ld a,1fh ; imposta gli attributi del carattere 0609 FB0B D3 8E out (8eh),a 0610 FB0D 3E 1F ld a,31 ; update 0611 FB0F D3 8C out (8ch),a 0612 FB11 AF xor a 0613 FB12 D3 8D out (8dh),a 0614 FB14 F1 pop af 0615 FB15 C9 ret 0616 FB16 0617 FB16 ;------------------------------------------------------ 0618 FB16 ; attende la ritraccia del video nuovo 0619 FB16 0620 FB16 F5 waitn: push af 0621 FB17 0622 FB17 DB 8C waitn1: in a,(8ch) 0623 FB19 CB 7F bit 7,a 0624 FB1B 28 FA jr z,waitn1 0625 FB1D F1 pop af 0626 FB1E C9 ret 0627 FB1F 0628 FB1F ;------------------------------------------------------ 0629 FB1F ; Calcola la locazione del video in base alla riga/colonna nella locazione puntata da HL e HL+1 0630 FB1F ; Chiamare "vloc" per il video vecchio, "nloc" per il video nuovo 0631 FB1F ; Ritorna DE. HL punterà al primo carattere da visualizzare 0632 FB1F ; Sporca DE e HL 0633 FB1F ; Con l'entry-point vloc1 il registro BC deve contenere il valore della riga/colonna 0634 FB1F 0635 FB1F C5 vloc: push bc 0636 FB20 46 ld b,(hl) ; numero riga 0637 FB21 23 inc hl 0638 FB22 4E ld c,(hl) ; numero colonna 0639 FB23 18 01 jr vloc1a 0640 FB25 0641 FB25 C5 vloc1: push bc 0642 FB26 F5 vloc1a: push af 0643 FB27 E5 push hl 0644 FB28 21 00 EC ld hl,0ec00h ; prima locazione del video vecchio 0645 FB2B 11 20 00 ld de,00020h ; numero di caratteri che compongono una riga sul video vecchio 0646 FB2E 18 0F jr loc1 0647 FB30 0648 FB30 C5 nloc: push bc 0649 FB31 46 ld b,(hl) ; numero riga 0650 FB32 23 inc hl 0651 FB33 4E ld c,(hl) ; numero colonna 0652 FB34 18 01 jr nloc1a 0653 FB36 0654 FB36 C5 nloc1: push bc 0655 FB37 F5 nloc1a: push af 0656 FB38 E5 push hl 0657 FB39 21 58 01 ld hl,00158h ; indirizzo del primo carattere più offset (0158h) per centrare la videata sul video nuovo 0658 FB3C 11 50 00 ld de,00050h ; numero di caratteri che compongono una riga sul video nuovo 0659 FB3F 0660 FB3F 78 loc1: ld a,b ; aggiunge il numero di caratteri che compongono una riga per tutte le righe richieste 0661 FB40 B7 or a ; cp 00h 0662 FB41 28 04 jr z,loc2 0663 FB43 19 add hl,de ; somma il numero di caratteri 0664 FB44 05 dec b 0665 FB45 18 F8 jr loc1 0666 FB47 0667 FB47 06 00 loc2: ld b,00h ; aggiunge il numero di caratteri relativi alla colonna richiesta 0668 FB49 09 add hl,bc 0669 FB4A EB ex de,hl ; mette il risultato in DE 0670 FB4B 0671 FB4B E1 pop hl 0672 FB4C F1 pop af 0673 FB4D C1 pop bc 0674 FB4E 0675 FB4E 23 inc hl ; punta al primo carattere del messaggio 0676 FB4F C9 ret 0677 FB50 0678 FB50 ;------------------------------------------------------ 0679 FB50 ; Visualizza il messaggio puntato da HL sui display della tastiera esadecimale 0680 FB50 0681 FB50 F5 msg: push af 0682 FB51 C5 push bc 0683 FB52 01 F7 08 ld bc,08F7h 0684 FB55 7E msg1: ld a,(hl) 0685 FB56 ED 79 out (c),a 0686 FB58 23 inc hl 0687 FB59 0D dec c 0688 FB5A 05 dec b 0689 FB5B AF xor a 0690 FB5C B8 cp b 0691 FB5D 20 F6 jr nz,msg1 0692 FB5F C1 pop bc 0693 FB60 F1 pop af 0694 FB61 C9 ret 0695 FB62 0696 FB62 ;------------------------------------------------------ 0697 FB62 ; 0698 FB62 ; Nuova routine di input tastiera per il monitor esadecimale 0699 FB62 ; Sostituisce la 80AA e accetta l'input dalla tastiera alfanumerica vecchia o nuova 0700 FB62 ; o dalla tastiera esadecimale convertendo il valore ricevuto in modo da essere 0701 FB62 ; compatibile con la 80AA 0702 FB62 ; 0703 FB62 ; Dati ricevuti dalla tastiera: 0704 FB62 ; Numeri da 0 a 9: da 30h a 39h 0705 FB62 ; Lettere da A ad F: da 61h a 66h 0706 FB62 ; Shift+numero da 1 a 9: da 21h a 29h 0707 FB62 ; Shift+lettere da A ad F: da 41h a 46h 0708 FB62 ; Return: 0dh 0709 FB62 0710 FB62 0711 FB62 C5 input: push bc 0712 FB63 D5 push de 0713 FB64 E5 push hl 0714 FB65 0715 FB65 CD 63 FA t1: call chect ; Se non c'è la scheda video vecchia salta il controllo e passa subito alla tastiera nuova 0716 FB68 20 06 jr nz,t2 0717 FB6A 0718 FB6A DB EA t1x: in a,(0eah) ; tastiera vecchia 0719 FB6C CB 7F bit 7,a 0720 FB6E 20 FA jr nz,t1x 0721 FB70 0722 FB70 DB 85 t2: in a,(085h) ; tastiera nuova 0723 FB72 CB 7F bit 7,a 0724 FB74 28 FA jr z,t2 0725 FB76 21 56 04 t2es1: ld hl,0456h ; tastiera esadecimale 0726 FB79 DB F0 t2es2: in a,(0f0h) 0727 FB7B CB 7F bit 7,a 0728 FB7D 28 F7 jr z,t2es1 0729 FB7F 2B t2es3: dec hl 0730 FB80 7C ld a,h 0731 FB81 B5 or l 0732 FB82 20 F5 jr nz,t2es2 0733 FB84 0734 FB84 ; Input da tastiere 0735 FB84 CD 63 FA t2a: call chect ; Se non c'è la scheda video vecchia salta il controllo e passa subito alla tastiera nuova 0736 FB87 20 06 jr nz,t2ax 0737 FB89 0738 FB89 DB EA in a,(0eah) ; tastiera vecchia 0739 FB8B CB 7F bit 7,a 0740 FB8D 20 38 jr nz,t2b 0741 FB8F 0742 FB8F DB 85 t2ax: in a,(085h) ; tastiera nuova 0743 FB91 2F cpl 0744 FB92 CB 7F bit 7,a 0745 FB94 20 31 jr nz,t2b 0746 FB96 DB F0 in a,(0f0h) ; tastiera esadecimale 0747 FB98 CB 7F bit 7,a 0748 FB9A 28 10 jr z,tes4 0749 FB9C 18 E6 jr t2a ; se non ho premuto nulla sulle tre tastiere allora looppa 0750 FB9E 0751 FB9E ; Input da tastiera esadecimale 0752 FB9E 21 56 04 tes1: ld hl,0456h 0753 FBA1 0754 FBA1 DB F0 tes2: in a,(0f0h) 0755 FBA3 CB 7F bit 7,a 0756 FBA5 28 F7 jr z,tes1 0757 FBA7 2B tes3: dec hl 0758 FBA8 7C ld a,h 0759 FBA9 B5 or l 0760 FBAA 20 F5 jr nz,tes2 0761 FBAC 0762 FBAC DB F0 tes4: in a,(0f0h) 0763 FBAE CB 7F bit 7,a 0764 FBB0 20 FA jr nz,tes4 0765 FBB2 47 ld b,a 0766 FBB3 21 05 00 ld hl,0005h 0767 FBB6 CD 18 FC call rit 0768 FBB9 0769 FBB9 DB F0 tes5: in a,(0f0h) 0770 FBBB 4F ld c,a 0771 FBBC E6 7F and 7fh 0772 FBBE B8 cp b 0773 FBBF 20 F8 jr nz,tes5 0774 FBC1 CB 79 bit 7,c 0775 FBC3 20 D9 jr nz,tes1 0776 FBC5 0777 FBC5 18 4D tes6: jr texit 0778 FBC7 0779 FBC7 ; Conversione dato per tastiere alfanumeriche 0780 FBC7 E6 7F t2b: and 7fh 0781 FBC9 0782 FBC9 FE 0D cp 0dh ; controlla se è stato premuto RETURN 0783 FBCB 20 04 jr nz,t3 0784 FBCD 3E 10 ld a,10h ; se si carica il valore di Control+0 0785 FBCF 18 43 jr texit 0786 FBD1 0787 FBD1 47 t3: ld b,a ; salva il registro A 0788 FBD2 D9 exx ; recupera il registro D' 0789 FBD3 7A ld a,d 0790 FBD4 D9 exx 0791 FBD5 B7 or a ; cp 00h - Se <> 0 deve controllare anche il BACKSPACE 0792 FBD6 78 ld a,b ; ripristina il registro A 0793 FBD7 28 08 jr z,t3b 0794 FBD9 0795 FBD9 FE 08 cp 08h ; controlla se è stato premuto BACKSPACE 0796 FBDB 20 04 jr nz,t3b 0797 FBDD 3E 1F ld a,01fh ; se si carica il valore 01fh (equivalente a CTRL+F sulla tastiera esadecimale) 0798 FBDF 18 33 jr texit 0799 FBE1 0800 FBE1 FE 3A t3b: cp 03ah ; controlla se è stato premuto un numero 0801 FBE3 30 08 jr nc,t4 0802 FBE5 FE 30 cp 030h 0803 FBE7 38 04 jr c,t4 0804 FBE9 D6 30 sub 030h ; se si sottrae 30h ed esce 0805 FBEB 18 27 jr texit 0806 FBED 0807 FBED FE 67 t4: cp 67h ; controlla se è stata premuta una lettera tra A ed F 0808 FBEF 30 08 jr nc,t5 0809 FBF1 FE 61 cp 61h 0810 FBF3 38 04 jr c,t5 0811 FBF5 D6 57 sub 57h ; se si sottrae 57h ed esce 0812 FBF7 18 1B jr texit 0813 FBF9 0814 FBF9 FE 2A t5: cp 2ah ; controlla se è stato premuto shift+numero (escluso 0) 0815 FBFB 30 08 jr nc,t6 0816 FBFD FE 21 cp 21h 0817 FBFF 38 04 jr c,t6 0818 FC01 D6 10 sub 10h ; se si sottrae 10h ed esce 0819 FC03 18 0F jr texit 0820 FC05 0821 FC05 FE 47 t6: cp 47h ; controlla se è stato premuto shift+lettera da A ad F 0822 FC07 30 08 jr nc,t7 0823 FC09 FE 41 cp 41h 0824 FC0B 38 04 jr c,t7 0825 FC0D D6 27 sub 27h ; se si sottrae 27h ed esce 0826 FC0F 18 03 jr texit 0827 FC11 0828 FC11 C3 65 FB t7: jp t1 0829 FC14 0830 FC14 E1 texit: pop hl 0831 FC15 D1 pop de 0832 FC16 C1 pop bc 0833 FC17 C9 ret 0834 FC18 0835 FC18 ; Genera un ritardo 0836 FC18 0837 FC18 E5 rit: push hl 0838 FC19 F5 push af 0839 FC1A 0840 FC1A CD 25 FC rit1: call rit2 0841 FC1D 2B dec hl 0842 FC1E 7C ld a,h 0843 FC1F B5 or l 0844 FC20 20 F8 jr nz,rit1 0845 FC22 F1 pop af 0846 FC23 E1 pop hl 0847 FC24 C9 ret 0848 FC25 0849 FC25 F5 rit2: push af 0850 FC26 D5 push de 0851 FC27 11 47 00 ld de,0047h 0852 FC2A 0853 FC2A 1B rit3: dec de 0854 FC2B 7A ld a,d 0855 FC2C B3 or e 0856 FC2D 20 FB jr nz,rit3 0857 FC2F D1 pop de 0858 FC30 F1 pop af 0859 FC31 C9 ret 0860 FC32 0861 FC32 ;------------------------------------------------------ 0862 FC32 ; 0863 FC32 ; Nuova routine di output su video per monitor esadecimale 0864 FC32 ; Sostituisce la 80EC e accetta l'input dalle locazioni da 0000h a 0007h 0865 FC32 ; convertendo il valore letto in modo da essere compatibile con la 80EC 0866 FC32 ; Con l'entry point "video1" i registri BC, DE e HL devono essere già impostati 0867 FC32 ; 0868 FC32 0869 FC32 F5 video: push af 0870 FC33 C5 push bc 0871 FC34 D5 push de 0872 FC35 E5 push hl 0873 FC36 0874 FC36 3E 20 ld a,20h ; spegne il cursore sul video nuovo 0875 FC38 CD AC FA call cursor 0876 FC3B 0877 FC3B 11 07 00 ld de,0007h ; contatore numero di caratteri da visualizzare (indica anche la locazione da cui prelevare il carattere da visualizzare) 0878 FC3E 01 00 EC ld bc,0ec00h ; posizione video vecchio 0879 FC41 21 00 00 ld hl,0000h ; posizione video nuovo 0880 FC44 0881 FC44 3E 20 ld a,20h ; spegne il cursore sul video nuovo 0882 FC46 CD AC FA call cursor 0883 FC49 0884 FC49 E5 m1: push hl ; salva la posizione del video nuovo 0885 FC4A 21 8C FC ld hl,tabvid ; calcola il carattere da visualizzare leggendolo dalla tabella di conversione 0886 FC4D 0887 FC4D C5 push bc 0888 FC4E 1A ld a,(de) ; legge il valore da visualizzare 0889 FC4F 06 00 ld b,0h ; lo converte nel carattere ascii 0890 FC51 4F ld c,a 0891 FC52 09 add hl,bc 0892 FC53 C1 pop bc 0893 FC54 0894 FC54 7E ld a,(hl) ; legge dalla tabella il carattere da visualizzare 0895 FC55 0896 FC55 CD 63 FA call chect ; controlla se esiste la scheda video vecchia 0897 FC58 20 04 jr nz,m2 ; se non esiste non visualizza il carattere sulla scheda video vecchia 0898 FC5A 0899 FC5A CD 83 FA call waitv ; attende la ritraccia video vecchio 0900 FC5D 02 ld (bc),a ; visualizza il carattere sul video vecchio 0901 FC5E 0902 FC5E E1 m2: pop hl ; ripristina la posizione del video nuovo 0903 FC5F CD F8 FC call lf060 ; carica in R18 e R19 l'indirizzo (HL) del cursore e del carattere da visualizzare 0904 FC62 CD 03 FB call writen ; visualizza il carattere sul video nuovo 0905 FC65 0906 FC65 0C inc c ; incrementa la posizione del video vecchio 0907 FC66 2C inc l ; incrementa la posizione del video nuovo 0908 FC67 1D dec e ; decrementa il contatore dei caratteri da visualizzare 0909 FC68 7B ld a,e ; controlla se ci sono altri caratteri da visualizzare 0910 FC69 FE FF cp 0ffh 0911 FC6B 20 DC jr nz,m1 ; looppa se ci sono altri caratteri da visualizzare 0912 FC6D 0913 FC6D ;------------------------------------------------------ 0914 FC6D ; Visualizza sui display della tastiera esadecimale 0915 FC6D ;------------------------------------------------------ 0916 FC6D 01 F7 00 ld bc,00f7h ; porta di output del display 0917 FC70 11 07 00 ld de,0007h ; valore da visualizzare 0918 FC73 0919 FC73 21 B0 FC m3: ld hl,tabdis ; carica l'indirizzo della tabella di conversione in HL 0920 FC76 1A ld a,(de) ; legge il valore da visualizzare e lo mette in A 0921 FC77 0922 FC77 C5 push bc ; carica il valore da visualizzare in BC 0923 FC78 4F ld c,a 0924 FC79 AF xor a 0925 FC7A 47 ld b,a 0926 FC7B 09 add hl,bc ; HL ora punta all'indirizzo contenente il valore convertito 0927 FC7C C1 pop bc 0928 FC7D 0929 FC7D 7E ld a,(hl) ; carica il valore convertito in A 0930 FC7E ED 79 out (c),a ; e lo invia al display 0931 FC80 0932 FC80 1D dec e ; decrementa e passa al prossimo display/valore 0933 FC81 0D dec c 0934 FC82 79 ld a,c 0935 FC83 FE EF cp 0efh 0936 FC85 20 EC jr nz,m3 ; (-16) 0937 FC87 0938 FC87 E1 pop hl 0939 FC88 D1 pop de 0940 FC89 C1 pop bc 0941 FC8A F1 pop af 0942 FC8B C9 ret 0943 FC8C 0944 FC8C 0945 FC8C 303132333435tabvid: .byte "0123456789ABCDEF" 0945 FC92 36373839414243444546 0946 FC9C 2D204D522348 .byte "-", " ", "M", "R", "#", "H", "L", "P", "C", "G" 0946 FCA2 4C504347 0947 FCA6 4E5152545556 .byte "NQRTUVJY S" 0947 FCAC 4A592053 0948 FCB0 0949 FCB0 ;------------------------------------------------------ 0950 FCB0 ; Tabella caratteri display 0951 FCB0 ; Valori per l'accensione dei segmenti del display: 0952 FCB0 ; 0953 FCB0 ; 1 0954 FCB0 ; - bit a 1 spegne il segmento 0955 FCB0 ; 32 | | 2 0956 FCB0 ; - 64 F0 = display a destra 0957 FCB0 ; 16 | | 4 !! 0958 FCB0 ; - F7 = display a sinistra 0959 FCB0 ; 8 0960 FCB0 ; 128 = punto decimale 0961 FCB0 ; 0962 FCB0 C0 tabdis: .byte 0c0h ;carattere 0 "0" 0963 FCB1 F9 .byte 0f9h ;carattere 1 "1" 0964 FCB2 A4 .byte 0a4h ;carattere 2 "2" 0965 FCB3 B0 .byte 0b0h ;carattere 3 "3" 0966 FCB4 99 .byte 099h ;carattere 4 "4" 0967 FCB5 92 .byte 092h ;carattere 5 "5" o "S" 0968 FCB6 82 .byte 082h ;carattere 6 "6" 0969 FCB7 F8 .byte 0f8h ;carattere 7 "7" 0970 FCB8 80 .byte 080h ;carattere 8 "8" 0971 FCB9 90 .byte 090h ;carattere 9 "9" 0972 FCBA 88 .byte 088h ;carattere 0A "A" 0973 FCBB 83 .byte 083h ;carattere 0B "b" 0974 FCBC C6 .byte 0c6h ;carattere 0C "C" 0975 FCBD A1 .byte 0a1h ;carattere 0d "d" 0976 FCBE 86 .byte 086h ;carattere 0E "E" 0977 FCBF 8E .byte 08eh ;carattere 0F "F" 0978 FCC0 BF .byte 0bfh ;carattere 10 "-" 0979 FCC1 FF .byte 0ffh ;carattere 11 " " blank 0980 FCC2 AB .byte 0abh ;carattere 12 "n" bassa 0981 FCC3 9D .byte 09dh ;carattere 13 "u" alta 0982 FCC4 B6 .byte 0b6h ;carattere 14 "3" linee orizzontali" 0983 FCC5 89 .byte 089h ;carattere 15 "H" 0984 FCC6 C7 .byte 0c7h ;carattere 16 "L" 0985 FCC7 8C .byte 08ch ;carattere 17 "P" 0986 FCC8 A7 .byte 0a7h ;carattere 18 "c" bassa 0987 FCC9 C2 .byte 0c2h ;carattere 19 "G" 0988 FCCA C8 .byte 0c8h ;carattere 1A "N" 0989 FCCB 98 .byte 098h ;carattere 1B "q" 0990 FCCC AF .byte 0afh ;carattere 1C "r" 0991 FCCD 87 .byte 087h ;carattere 1D "t" 0992 FCCE C1 .byte 0c1h ;carattere 1E "U" 0993 FCCF E3 .byte 0e3h ;carattere 1F "u" bassa 0994 FCD0 E1 .byte 0e1h ;carattere 20 "J" 0995 FCD1 91 .byte 091h ;carattere 21 "Y" 0996 FCD2 FF .byte 0ffh ;carattere 22 " " blank 0997 FCD3 FF .byte 0ffh ;carattere 23 " " blank 0998 FCD4 0999 FCD4 1000 FCD4 ;------------------------------------------------------ 1001 FCD4 ; Visualizza un messaggio puntato da HL sui display 1002 FCD4 ; Il messaggio da visualizzare deve essere già nel formato compatibile con i caratteri dei display, e deve essere lungo 8 bytes 1003 FCD4 1004 FCD4 F5 vdisp: push af 1005 FCD5 C5 push bc 1006 FCD6 E5 push hl 1007 FCD7 1008 FCD7 0E F7 ld c,0f7h ; indirizzo del primo display 1009 FCD9 1010 FCD9 7E vdisp1: ld a,(hl) ; carica il carattere da visualizzare in A 1011 FCDA ED 79 out (c),a ; e lo invia al display 1012 FCDC 1013 FCDC 23 inc hl ; punta al prossimo carattere da visualizzare 1014 FCDD 0D dec c ; punta al prossimo display 1015 FCDE 79 ld a,c 1016 FCDF FE EF cp 0efh 1017 FCE1 20 F6 jr nz,vdisp1 1018 FCE3 1019 FCE3 E1 pop hl 1020 FCE4 C1 pop bc 1021 FCE5 F1 pop af 1022 FCE6 1023 FCE6 C9 ret 1024 FCE7 1025 FCE7 ;------------------------------------------------------ 1026 FCE7 ; Visualizza il carattere contenuto in A sul display puntato da C, convertendolo nel formato compatibile con i caratteri dei display 1027 FCE7 1028 FCE7 E5 vdispc: push hl 1029 FCE8 F5 push af 1030 FCE9 C5 push bc 1031 FCEA 1032 FCEA 21 B0 FC ld hl,tabdis ; carica l'indirizzo della tabella di conversione in HL 1033 FCED 4F ld c,a ; carica il valore da visualizzare in BC 1034 FCEE AF xor a 1035 FCEF 47 ld b,a 1036 FCF0 09 add hl,bc ; HL ora punta all'indirizzo contenente il valore convertito 1037 FCF1 7E ld a,(hl) ; carica il valore convertito in A 1038 FCF2 1039 FCF2 C1 pop bc 1040 FCF3 ED 79 out (c),a ; invia il valore convertito al display 1041 FCF5 1042 FCF5 F1 pop af 1043 FCF6 E1 pop hl 1044 FCF7 C9 ret 1045 FCF8 1046 FCF8 ;------------------------------------------------------ 1047 FCF8 ; Routine f060h della eprom 2390 (carica in R14, R15, R18 e R19 l'indirizzo (HL) del cursore e del carattere da visualizzare) 1048 FCF8 ; Routine f06eh della eprom 2390 (carica in R18 e R19 l'indirizzo (HL) del carattere da visualizzare) 1049 FCF8 1050 FCF8 F5 lf060: push af 1051 FCF9 3E 0E ld a,0eh ; carica da HL l'indirizzo del cursore 1052 FCFB D3 8C out (8ch),a 1053 FCFD 7C ld a,h 1054 FCFE D3 8D out (8dh),a 1055 FD00 3E 0F ld a,0fh 1056 FD02 D3 8C out (8ch),a 1057 FD04 7D ld a,l 1058 FD05 D3 8D out (8dh),a 1059 FD07 F1 pop af 1060 FD08 1061 FD08 F5 lf06e: push af 1062 FD09 3E 12 ld a,12h ; carica da HL l'indirizzo del carattere da visualizzare in R18 e R19 1063 FD0B D3 8C out (8ch),a 1064 FD0D 7C ld a,h 1065 FD0E D3 8D out (8dh),a 1066 FD10 3E 13 ld a,13h 1067 FD12 D3 8C out (8ch),a 1068 FD14 7D ld a,l 1069 FD15 D3 8D out (8dh),a 1070 FD17 1071 FD17 3E 1F ld a,1fh ; accesso a R31 del SY6545 per fare l'update 1072 FD19 D3 8C out (8ch),a 1073 FD1B F1 pop af 1074 FD1C C9 ret 1075 FD1D 1076 FD1D 1077 FD1D ;------------------------------------------------------ 1078 FD1D ; Routine f0a5h della eprom 2390 (inizializza i registri del SY6545 ed i PIO) 1079 FD1D 1080 FD1D DB 89 lf0a5: in a,(89h) ; setta il video a 80 colonne 1081 FD1F CB 8F res 1,a 1082 FD21 21 61 FD ld hl,tabini ; carica in HL l'indirizzo della tabella contenente i parametri di inizializzazione del video nuovo 1083 FD24 D3 89 out (89h),a 1084 FD26 3E 8F ld a,8fh ; inizializza i PIO 1085 FD28 D3 82 out (82h),a ; PIO 0/A (RAM 0) 1086 FD2A D3 86 out (86h),a ; PIO 1/A (RAM 1) 1087 FD2C D3 8A out (8ah),a ; PIO 2/A (RAM 2) 1088 FD2E 3E CF ld a,0cfh 1089 FD30 D3 83 out (83h),a ; PIO 0/B (stampante) 1090 FD32 08 ex af,af' 1091 FD33 AF xor a 1092 FD34 D3 83 out (83h),a 1093 FD36 08 ex af,af' 1094 FD37 D3 87 out (87h),a ; PIO 1/B (tastiera) 1095 FD39 08 ex af,af' 1096 FD3A 3D dec a 1097 FD3B D3 87 out (87h),a 1098 FD3D 08 ex af,af' 1099 FD3E D3 8B out (8bh),a ; PIO 2/B (busy stampante / controllo 40-80 caratteri) 1100 FD40 3E F1 ld a,0f1h 1101 FD42 D3 8B out (8bh),a 1102 FD44 1103 FD44 06 0C ld b,0ch ; inizializza i registri del SY6545 da R11 a R0 1104 FD46 78 lf0ce: ld a,b 1105 FD47 3D dec a 1106 FD48 D3 8C out (8ch),a 1107 FD4A 7E ld a,(hl) 1108 FD4B D3 8D out (8dh),a 1109 FD4D 23 inc hl 1110 FD4E 10 F6 djnz lf0ce ; (-10) 1111 FD50 1112 FD50 06 08 lf0d8: ld b,08h ; azzera i registri del SY6545 da R19 a R12 1113 FD52 1114 FD52 78 lf0da: ld a,b 1115 FD53 C6 0B add a,0bh 1116 FD55 D3 8C out (8ch),a 1117 FD57 AF xor a 1118 FD58 D3 8D out (8dh),a 1119 FD5A 10 F6 djnz lf0da ; (-10) 1120 FD5C 1121 FD5C 3E 1F lf086: ld a,1fh ; accesso a R31 del SY6545 per fare l'update 1122 FD5E D3 8C out (8ch),a 1123 FD60 C9 ret 1124 FD61 1125 FD61 0B000B481818tabini: .byte 0bh, 00h, 0bh, 48h, 18h, 18h, 00h, 1ah, 28h, 57h, 50h, 6fh 1125 FD67 001A2857506F 1126 FD6D 1127 FD6D ;------------------------------------------------------ 1128 FD6D ; Calcola l'indirizzo della tabella TABDIS e lo ritorna in HL 1129 FD6D 1130 FD6D 21 B0 FC ctabdi: ld hl,tabdis 1131 FD70 C9 ret 1132 FD71 1133 FD71 ;------------------------------------------------------ 1134 FD71 ; Jump table per il richiamo della routine di gestione della voce di menu selezionata 1135 FD71 1136 FD71 0B F9 tabtas: .dw tast1 1137 FD73 18 F9 .dw tast2 1138 FD75 25 F9 .dw tast3 1139 FD77 32 F9 .dw tast4 1140 FD79 3F F9 .dw tast5 1141 FD7B 56 F9 .dw tast6 1142 FD7D 64 F9 .dw tast7 1143 FD7F 72 F9 .dw tast8 1144 FD81 7C F9 .dw tast9 1145 FD83 86 F9 .dw tastA 1146 FD85 93 F9 .dw tastB 1147 FD87 A9 F9 .dw tastC 1148 FD89 B6 F9 .dw tastD 1149 FD8B BF F9 .dw tastE 1150 FD8D C8 F9 .dw tastF 1151 FD8F D7 F9 .dw tast10 1152 FD91 EA F9 .dw tast11 1153 FD93 F7 F9 .dw tast12 1154 FD95 1155 FD95 ;------------------------------------------------------ 1156 FD95 ; Jump table per il richiamo della routine di visualizzazione della pagina di menù 1157 FD95 1158 FD95 B5 FA tabmen: .dw vmenu1 1159 FD97 BE FA .dw vmenu2 1160 FD99 C7 FA .dw vmenu3 1161 FD9B 1162 FD9B ;------------------------------------------------------ 1163 FD9B 1164 FFFF .org 0ffffh 1165 FFFF 00 .byte 00h 1166 10000 1167 10000 .end Type Key: N=NULL_SEG C=CODE_SEG B=BIT_SEG X=EXTD_SEG D=DATA_SEG L=Local E=Export Value Type Label ----- ---- ------------------------------ 005F N banco F5F0 N curs FA04 N convnu FA0F N convn1 FA15 N convn2 FA45 N checv FA4E N checv1 FA5A N checv2 FA60 N checv3 FA63 N chect FAAC N cursor FD6D N ctabdi FA2B N disp FA2E N disp1 FA6C N initv FA91 N initn FA96 N initn1 FB62 N input FB3F N loc1 FB47 N loc2 FCF8 N lf060 FD08 N lf06e FD1D N lf0a5 FD46 N lf0ce FD50 N lf0d8 FD52 N lf0da FD5C N lf086 F000 N menu1 F200 N menu2 F400 N menu3 FB50 N msg FB55 N msg1 FC49 N m1 FC5E N m2 FC73 N m3 FB30 N nloc FB36 N nloc1 FB37 N nloc1a F600 N out0 F608 N out1 F610 N out2 F618 N out3 F620 N out4 F628 N out5 F630 N out6 F638 N out7 F640 N out8 F648 N out9 F650 N out10 F658 N out11 FA1A N punt FC18 N rit FC1A N rit1 FC25 N rit2 F83F N start FC2A N rit3 F8AD N sp0 F8B0 N sp1 F8B6 N sp2 F8B9 N sp3 FA3A N setban F858 N tram1 F85B N tram2 F86A N tram2a F875 N tram3 F87F N tram4 F88C N tram5 F892 N tram6 F898 N tram7 F8A9 N tram8 F8C5 N tast0 F8CE N tast0a F8F2 N tast0b F904 N tast0c F90B N tast1 F918 N tast2 F925 N tast3 F932 N tast4 F93F N tast5 F94A N tast5a F956 N tast6 F964 N tast7 F972 N tast8 F97C N tast9 F986 N tastA F993 N tastB F9A9 N tastC F9B6 N tastD F9BF N tastE F9C8 N tastF F9D7 N tast10 F9E1 N tast1a F9EA N tast11 F9F7 N tast12 FB65 N t1 FB6A N t1x FB70 N t2 FB76 N t2es1 FB79 N t2es2 FB7F N t2es3 FB84 N t2a FB8F N t2ax FB9E N tes1 FBA1 N tes2 FBA7 N tes3 FBAC N tes4 FBB9 N tes5 FBC5 N tes6 FBC7 N t2b FBD1 N t3 FBE1 N t3b FBED N t4 FBF9 N t5 FC05 N t6 FC11 N t7 FC14 N texit FC8C N tabvid FCB0 N tabdis FD61 N tabini FD71 N tabtas FD95 N tabmen FAB5 N vmenu1 FABE N vmenu2 FAC7 N vmenu3 FACE N vis FAD2 N vis1 FADF N vis2 FB1F N vloc FB25 N vloc1 FB26 N vloc1a FC32 N video FCD4 N vdisp FCD9 N vdisp1 FCE7 N vdispc FA83 N waitv FA89 N waitv1 FA8F N waitv2 FB03 N writen FB16 N waitn FB17 N waitn1 ADDR 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ----------------------------------------------------- F800 C3 3F F8 C3 62 FB C3 32 FC C3 1D FD C3 F8 FC C3 F810 08 FD C3 45 FA C3 63 FA C3 83 FA C3 16 FB C3 03 F820 FB C3 AC FA C3 1F FB C3 30 FB C3 25 FB C3 36 FB F830 C3 6C FA C3 91 FA C3 6D FD C3 D4 FC C3 E7 FC F3 F840 21 ED 45 22 66 00 AF D3 D6 D9 57 D9 3E 28 D3 5F F850 3E CF D3 87 AF 3D D3 87 21 00 00 23 7C FE 10 28 F860 14 DB EB CB 7F 20 F4 21 00 30 2B 7C B5 20 FB DB F870 EA CB 7F 20 17 DB 85 2F CB 7F 20 10 01 FF 01 DB F880 F0 CB 7F 28 24 0B 78 B1 20 F5 18 21 E6 7F FE 1B F890 20 1B 21 58 F6 01 F7 08 7E ED 79 23 0D 05 AF B8 F8A0 20 F6 3E 26 D3 5F C3 00 F0 FE 1F 28 E5 21 FF EB F8B0 7E 2F 77 BE 28 03 2B 18 F7 2F 77 BE 20 F8 F9 CD F8C0 1D FD CD 45 FA 21 00 F6 CD 50 FB CD B5 FA CD 62 F8D0 FB F5 FE 10 28 2E FE 13 30 F4 FE 01 38 F0 21 F0 F8E0 F5 CD 1F FB FE 11 CD 04 FA 30 07 7D 12 CD 03 FB F8F0 18 12 7C 12 CD 03 FB 13 7D 12 CD 03 FB 13 3E 3C F900 12 CD 03 FB F1 21 71 FD C3 1A FA 21 40 F6 CD 2B F910 FA 3E 19 D3 5F C3 00 F0 21 08 F6 CD 2B FA 3E 00 F920 D3 5F C3 00 F0 21 10 F6 CD 2B FA 3E 01 D3 5F C3 F930 00 F0 21 48 F6 CD 2B FA 3E 1A D3 5F C3 00 F0 21 F940 18 F6 CD 2B FA 3E 08 11 00 00 CD 3A FA 3C 3C FE F950 18 20 F7 C3 00 00 CD 2E FA 3E 04 11 00 80 CD 3A F960 FA C3 00 80 CD 2E FA 3E 20 11 00 80 CD 3A FA C3 F970 00 80 CD 2E FA 3E 1C D3 5F C3 00 F0 CD 2E FA 3E F980 1E D3 5F C3 00 F0 21 28 F6 CD 2B FA 3E 06 D3 5F F990 C3 7D F1 CD 2E FA 3E 04 11 00 80 CD 3A FA 3E 18 F9A0 11 00 00 CD 3A FA C3 69 00 21 30 F6 CD 2B FA 3E F9B0 24 D3 5F C3 00 F0 21 38 F6 CD 2B FA C3 00 00 21 F9C0 38 F6 CD 2B FA C3 00 10 3E 07 11 70 00 CD 3A FA F9D0 3E 28 D3 5F C3 C5 F8 D9 79 D9 3C FE 04 38 02 3E F9E0 01 21 95 FD CD 1A FA C3 CE F8 21 50 F6 CD 2B FA F9F0 3E 22 D3 5F C3 00 F0 21 58 F6 CD 2B FA 3E 26 D3 FA00 5F C3 00 F0 26 20 F5 FE 10 38 04 26 53 D6 10 FE FA10 0A 38 02 C6 07 C6 30 6F F1 C9 F5 C5 3D CB 27 4F FA20 AF 47 09 4E 23 46 C5 E1 C1 F1 E9 CD 50 FB 3E 20 FA30 CD AC FA CD 6C FA CD 91 FA C9 D3 5F 21 00 F0 01 FA40 00 08 ED B0 C9 F5 E5 D9 06 00 D9 21 00 00 23 7C FA50 FE 10 20 06 D9 06 FF D9 18 06 DB EB CB 7F 20 EE FA60 E1 F1 C9 C5 47 D9 78 D9 B7 78 C1 C9 E5 D5 C5 21 FA70 00 EC 11 01 EC 36 20 01 FF 01 CD 83 FA ED B0 C1 FA80 D1 E1 C9 F5 CD 63 FA 20 06 DB EB CB 7F 20 FA F1 FA90 C9 F5 E5 21 00 00 CD 08 FD 3E 20 CD 03 FB 23 7D FAA0 FE 81 20 F2 7C FE 07 20 ED E1 F1 C9 F5 3E 0A D3 FAB0 8C F1 D3 8D C9 21 00 F0 D9 0E 01 D9 18 10 21 00 FAC0 F2 D9 0E 02 D9 18 07 21 00 F4 D9 0E 03 D9 CD 2E FAD0 FA F5 E5 CD 30 FB D5 E1 CD 08 FD E1 CD 1F FB 7E FAE0 CD 83 FA 12 13 CD 03 FB 23 AF BE 20 F2 23 2F BE FAF0 20 E0 21 F0 F5 CD 30 FB D5 E1 CD F8 FC AF CD AC FB00 FA F1 C9 CD 16 FB D3 80 F5 3E 1F D3 8E 3E 1F D3 FB10 8C AF D3 8D F1 C9 F5 DB 8C CB 7F 28 FA F1 C9 C5 FB20 46 23 4E 18 01 C5 F5 E5 21 00 EC 11 20 00 18 0F FB30 C5 46 23 4E 18 01 C5 F5 E5 21 58 01 11 50 00 78 FB40 B7 28 04 19 05 18 F8 06 00 09 EB E1 F1 C1 23 C9 FB50 F5 C5 01 F7 08 7E ED 79 23 0D 05 AF B8 20 F6 C1 FB60 F1 C9 C5 D5 E5 CD 63 FA 20 06 DB EA CB 7F 20 FA FB70 DB 85 CB 7F 28 FA 21 56 04 DB F0 CB 7F 28 F7 2B FB80 7C B5 20 F5 CD 63 FA 20 06 DB EA CB 7F 20 38 DB FB90 85 2F CB 7F 20 31 DB F0 CB 7F 28 10 18 E6 21 56 FBA0 04 DB F0 CB 7F 28 F7 2B 7C B5 20 F5 DB F0 CB 7F FBB0 20 FA 47 21 05 00 CD 18 FC DB F0 4F E6 7F B8 20 FBC0 F8 CB 79 20 D9 18 4D E6 7F FE 0D 20 04 3E 10 18 FBD0 43 47 D9 7A D9 B7 78 28 08 FE 08 20 04 3E 1F 18 FBE0 33 FE 3A 30 08 FE 30 38 04 D6 30 18 27 FE 67 30 FBF0 08 FE 61 38 04 D6 57 18 1B FE 2A 30 08 FE 21 38 FC00 04 D6 10 18 0F FE 47 30 08 FE 41 38 04 D6 27 18 FC10 03 C3 65 FB E1 D1 C1 C9 E5 F5 CD 25 FC 2B 7C B5 FC20 20 F8 F1 E1 C9 F5 D5 11 47 00 1B 7A B3 20 FB D1 FC30 F1 C9 F5 C5 D5 E5 3E 20 CD AC FA 11 07 00 01 00 FC40 EC 21 00 00 3E 20 CD AC FA E5 21 8C FC C5 1A 06 FC50 00 4F 09 C1 7E CD 63 FA 20 04 CD 83 FA 02 E1 CD FC60 F8 FC CD 03 FB 0C 2C 1D 7B FE FF 20 DC 01 F7 00 FC70 11 07 00 21 B0 FC 1A C5 4F AF 47 09 C1 7E ED 79 FC80 1D 0D 79 FE EF 20 EC E1 D1 C1 F1 C9 30 31 32 33 FC90 34 35 36 37 38 39 41 42 43 44 45 46 2D 20 4D 52 FCA0 23 48 4C 50 43 47 4E 51 52 54 55 56 4A 59 20 53 FCB0 C0 F9 A4 B0 99 92 82 F8 80 90 88 83 C6 A1 86 8E FCC0 BF FF AB 9D B6 89 C7 8C A7 C2 C8 98 AF 87 C1 E3 FCD0 E1 91 FF FF F5 C5 E5 0E F7 7E ED 79 23 0D 79 FE FCE0 EF 20 F6 E1 C1 F1 C9 E5 F5 C5 21 B0 FC 4F AF 47 FCF0 09 7E C1 ED 79 F1 E1 C9 F5 3E 0E D3 8C 7C D3 8D FD00 3E 0F D3 8C 7D D3 8D F1 F5 3E 12 D3 8C 7C D3 8D FD10 3E 13 D3 8C 7D D3 8D 3E 1F D3 8C F1 C9 DB 89 CB FD20 8F 21 61 FD D3 89 3E 8F D3 82 D3 86 D3 8A 3E CF FD30 D3 83 08 AF D3 83 08 D3 87 08 3D D3 87 08 D3 8B FD40 3E F1 D3 8B 06 0C 78 3D D3 8C 7E D3 8D 23 10 F6 FD50 06 08 78 C6 0B D3 8C AF D3 8D 10 F6 3E 1F D3 8C FD60 C9 0B 00 0B 48 18 18 00 1A 28 57 50 6F 21 B0 FC FD70 C9 0B F9 18 F9 25 F9 32 F9 3F F9 56 F9 64 F9 72 FD80 F9 7C F9 86 F9 93 F9 A9 F9 B6 F9 BF F9 C8 F9 D7 FD90 F9 EA F9 F7 F9 B5 FA BE FA C7 FA 00 00 00 00 00 FDA0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FDB0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FDC0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FDD0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FDE0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FDF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FEA0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FEB0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FEC0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FED0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FEE0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FEF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFA0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFB0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFC0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFD0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFE0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FFF0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 tasm: Number of errors = 0